/*
 * @Author: xiaosihan
 * @Date: 2023-07-04 16:27:47
 * @Last Modified by: xiaosihan
 * @Last Modified time: 2024-07-07 20:22:55
 */

import axios from 'axios';
import OSS from 'ali-oss';
import shortid from 'short-uuid';
import apiClient from '../apiClient';

// 公共接口
class UtilsServer {
  constructor() {}

  // oss 客户端
  ossClient?: OSS;

  // 获取上传令牌中
  getkeying = false;

  // 上传文件到 oss
  async uploadOss(file: File): Promise<any> {
    if (!this.ossClient && !this.getkeying) {
      this.getkeying = true;

      const OSS = (await import('ali-oss')).default;

      const result = await apiClient.get({ url: '/common/getAccessToken' });

      this.ossClient = new OSS({
        // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
        region: 'oss-cn-beijing',
        // region: 'oss-cn-chengdu',
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        accessKeyId: result.accessKeyId,
        accessKeySecret: result.accessKeySecret,
        // 从STS服务获取的安全令牌（SecurityToken）。
        stsToken: result.securityToken,
        // 刷新临时访问凭证的时间间隔，单位为毫秒。
        refreshSTSTokenInterval: 300000,
        // 填写Bucket名称。
        bucket: 'upload-custom',
      });

      this.getkeying = false;

      // 在有效时间结束后销毁 oss 实例 以便从新获取令牌
      setTimeout(() => {
        this.ossClient = undefined;
      }, 30000);
    }

    // 等待oss 初始完成
    while (this.getkeying) {
      await new Promise((resolve) => requestAnimationFrame(resolve));
    }

    // 设置文件名
    const fileName = await new Promise(async (resolve1, reject1) => {
      let end = file.name.slice(-3);
      let id = shortid.generate();

      if (/(jpg|png|peg|ebp)/i.test(end)) {
        const img = new Image();

        await new Promise((resolve2, reject2) => {
          img.onload = () => resolve2(img);
          img.onerror = reject2;
          img.src = URL.createObjectURL(file);
        });

        resolve1(`${img.width}_${img.height}_${file.size}_${id}.${end}`);
      } else {
        resolve1(`${id}.${end}`);
      }
    });

    if (this.ossClient) {
      const result = await this.ossClient
        .put(`${fileName}`, file, {
          headers: {
            // 指定上传文件的类型。
            // 'Content-Type': 'image/png',
            // 指定该Object被下载时网页的缓存行为。
            // 'Cache-Control': 'no-cache',
            'Cache-Control': 'max-age=99999999', //
            // 指定该Object被下载时的名称。
            // 'Content-Disposition': 'oss_download.txt',
            // 指定该Object被下载时的内容编码格式。
            'Content-Encoding': 'UTF-8',
            // 指定Object的存储类型。
            'x-oss-storage-class': 'Standard',
            // 指定Object的访问权限。
            // 'x-oss-object-acl': 'private',
            // 设置Object的标签，可同时设置多个标签。
            // 'x-oss-tagging': 'Tag1=1&Tag2=2',
            // 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true，表示禁止覆盖同名Object。
            'x-oss-forbid-overwrite': 'true',
          },
        })
        .catch((err) => {
          return undefined;
        });

      if (result) {
        result.url = result.url.replace(/https?:/, '');
        return result.url;
      } else {
        this.ossClient = undefined;
        return await this.uploadOss(file);
      }
    } else {
      return await this.uploadOss(file);
    }
  }

  // url 转 base64 服务
  async url_to_base64(url: string) {
    // const res = await this._get("/url_to_base64", { url });
    // return res;
    return '';
  }
}

const utilsServer = new UtilsServer();

export default utilsServer;
